/*************************************************************************************
 *	模块名称 : UDP模块头文件
 *	文件名称 : myudp.h
 *	版   本 : V1.0
 *	说   明 : 本文件包含了对 UDP服务器 和 UDP客户端 的常用操作的 封装函数的声明, 必要的数据结构的定义.
 *	修改记录 :
 *		     版本号       日期         作者        说明
 *	         V1.0     2022-06-17      YT        发布
 *
 *	Copyright (C), 2022-2030, Zhirui
 *************************************************************************************/

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/ip.h>
#include <arpa/inet.h>
#include <unistd.h>

#ifndef MY_UDP_H
#define MY_UDP_H

/**************************************************************************
* UDP传送文件结构体
* 在 UDP服务器 和 UDP客户端 之间传送文件时, 约定协议如下:
* 首先, 传送 UdpFileIndex 结构体, 其中包含 文件名 和 文件长度.
* 然后, 传送 文件内容.
* 在调用 文件传送函数 之前, 程序需要自行协定以区分于普通的数据发送
 *************************************************************************/
typedef struct 
{
    char FileName[100];
    int FileLen;
}UdpFileIndex;

/**************************************************************************
 * 函数名称: UdpSelfBind  
 * 函数说明: 在 套接字 绑定 IP和端口 
 * 参   数:  pSockFd      待绑定的 套接字 指针 , 
 *                       将生成 UDP数据报套接字 并赋值回主调函数
 *          strSelfIp    待绑定的 本机服务器 IP地址 
 *                       如果不需要绑定 IP地址, 则主调函数 传入 NULL
 *          UdpSelfPort  待绑定的 本地服务器 端口号 
 *                       如果不需要绑定 端口, 则主调函数 传入 -1
 * 返回值 :   0 初始化成功
 *          -1 初始化失败
 *************************************************************************/
extern int UdpSelfBind( int *pSockFd, const char strSelfIp[], int UdpSelfPort );

/**************************************************************************
 * 函数名称: UdpRecvfrom  
 * 函数说明: UDP本地服务器从客户端接收数据 
 * 参   数:  SockFd     套接字 
 *          RecvBuff   保存 接收到的数据所保存的首地址
 *          SizeRecv   指定 可以接收的最大数据字节数
 *          strClintIp 保存 接收到的数据的 发送客户端 IP地址 点分十进制IP地址字符串
 *                      如果主调函数输入 NULL, 则忽略接收
 *          pClintPort 保存 接收到的数据的 发送客户端 主机整型端口号
 *                      如果主调函数输入 NULL, 则忽略接收
 * 返回值 :  >0 接收到的数据字节数
 *          -1 接收失败
 *************************************************************************/
extern ssize_t UdpRecvfrom( int SockFd, void *RecvBuff, size_t SizeRecv, 
                            char strClintIp[], int *pClintPort );

/**************************************************************************
 * 函数名称: UdpSendto  
 * 函数说明: UDP主机 向 指定的 UDP主机IP和端口 发送 UDP数据包 
 * 参   数:  SockFd     套接字 
 *          SendBuff   待发送的数据首地址
 *          SizeSend   发送的数据字节数
 *          strClintIp 接收数据的 UDP主机 IP地址
 *          ClintPort  接收数据的 UDP 主机序整型端口号
 * 返回值 :  >0 发送成功的数据字节数
 *          -1 接收失败
 *************************************************************************/
extern ssize_t UdpSendto( int SockFd, const void *SendBuff, size_t SizeSend, 
                          const char strClintIp[], int ClintPort );

/**************************************************************************
 * 函数名称: UdpRecvFile  
 * 函数说明: 从 UDP客户端 接收文件 
 * 参   数:  SockFd         套接字 
 *          RecvFileName   保存接收到文件内容所保存到的文件名 (在原始文件名前加前缀: _UDP_ )
 *          strClintIp     保存 接收到的数据的 发送客户端 IP地址 点分十进制IP地址字符串
 *                          如果主调函数输入 NULL, 则忽略接收 
 *          pClintPort     保存 接收到的数据的 发送客户端 主机整型端口号
 *                          如果主调函数输入 NULL, 则忽略接收
 * 返回值 :   0 接收成功
 *          -1 接收失败
 *************************************************************************/
extern int UdpRecvFile( int SockFd, char RecvFileName[], char strClintIp[], int *pClintPort );

/**************************************************************************
 * 函数名称: UdpSendFile  
 * 函数说明: 向 UDP主机 发送文件 
 * 参   数:  SockFd         套接字 
 *          SendFileName   待发送文件的的文件名
 *          strClintIp     待接收UDP主机的 IP地址 点分十进制IP地址字符串
 *          pClintPort     待接收的 UDP主机 整型端口号
 * 返回值 :   0 接收成功
 *          -1 接收失败
 *************************************************************************/
extern int  UdpSendFile( int SockFd, const char SendFileName[], const char strClintIp[], int ClintPort );

#endif